#ifndef _TDEAPPORO_
#define _TDEAPPORO_

#include <iostream>
#include "tporo.h"
#include "tvectorporo.h"
using namespace std;

/** \file  tdeapporo.h
 *  \brief Clase que utiliza un vector de poros para representar las utilidades de un Deap.
 *
 *	Autor: Óscar Toledo Ballester, 48666364c.
 *      Autor: Alejandro Serrano Cases, 74364527f
 *	
 * 	Clase que utiliza un vector de poros para representar las utilidades de un Deap y sus caracteristicas.
 */

class TDeapPoro
{
   friend ostream & operator<<(ostream &,const TDeapPoro &);

   public:
        // Constructor por defecto
        TDeapPoro();
        // Constructor de copia
        TDeapPoro(const TDeapPoro &);
        // Destructor
        ~TDeapPoro();
        // Sobrecarga del operador asignación
        TDeapPoro & operator=(const TDeapPoro &);
        // Sobrecarga del operador igualdad
        bool operator==(const TDeapPoro &);
        // Sobrecarga del operador igualdad
        bool operator!=(const TDeapPoro & tdp);
        // Devuelve TRUE si el deap está vacío, FALSE en caso contrario
        bool EsVacio() const;
        // Inserta el elemento en el deap
        bool Insertar(const TPoro &);
        // Borra el elemento máximo en el deap
        bool BorrarMax();
        // Borra el elemento mínimo en el deap
        bool BorrarMin();
        // Devuelve el elemento máximo en el deap
        TPoro Max() const;
        // Devuelve el elemento mínimo en el deap
        TPoro Min() const;
        // Devuelve la altura del deap (la altura de un deap vacío es 0)
        int Altura() const;
        // Devuelve el número de nodos del deap (un deap vacío posee 0 nodos)
        int Nodos() const;
        // Devuelve  el recorrido en inorden
        TVectorPoro InordenAux(int)const;
        // Devuelve  el recorrido en preorden
        TVectorPoro PreordenAux(int)const;
        // Devuelve  el recorrido en postorden
        TVectorPoro PostordenAux(int)const;
        // Devuelve  el recorrido en inorden
        TVectorPoro Inorden()const;
        // Devuelve  el recorrido en preorden
        TVectorPoro Preorden()const;
        // Devuelve  el recorrido en postorden
        TVectorPoro Postorden()const;
        // Devuelve el recorrido por niveles
        TVectorPoro Niveles()const;

   private:
        TVectorPoro v;
        int posicion;
};


#endif
